_ostree_loose_path_with_suffix (buf, checksum, objtype, mode, "");
}
+/**
+ * _ostree_header_gfile_info_new:
+ * @mode: File mode
+ * @uid: File uid
+ * @gid: File gid
+ *
+ * OSTree only stores a subset of file attributes; for example,
+ * timestamps are intentionally not stored. This function creates a
+ * #GFileInfo based on the attributes of a `struct stat` that match
+ * those file attributes.
+ *
+ * Returns: (transfer full): A new #GFileInfo mapping a subset of @stbuf.
+ */
+GFileInfo *
+_ostree_header_gfile_info_new (mode_t mode, uid_t uid, gid_t gid)
+{
+ GFileInfo *ret = g_file_info_new ();
+ g_file_info_set_attribute_uint32 (ret, "standard::type", ot_gfile_type_for_mode (mode));
+ g_file_info_set_attribute_boolean (ret, "standard::is-symlink", S_ISLNK (mode));
+ g_file_info_set_attribute_uint32 (ret, "unix::uid", uid);
+ g_file_info_set_attribute_uint32 (ret, "unix::gid", gid);
+ g_file_info_set_attribute_uint32 (ret, "unix::mode", mode);
+ return ret;
+}
+
/*
* _ostree_loose_path_with_suffix:
* @buf: Output buffer, must be _OSTREE_LOOSE_PATH_MAX in size
mode = GUINT32_FROM_BE (mode);
rdev = GUINT32_FROM_BE (rdev);
- ret_file_info = g_file_info_new ();
- g_file_info_set_attribute_uint32 (ret_file_info, "standard::type", ot_gfile_type_for_mode (mode));
- g_file_info_set_attribute_boolean (ret_file_info, "standard::is-symlink", S_ISLNK (mode));
- g_file_info_set_attribute_uint32 (ret_file_info, "unix::uid", uid);
- g_file_info_set_attribute_uint32 (ret_file_info, "unix::gid", gid);
- g_file_info_set_attribute_uint32 (ret_file_info, "unix::mode", mode);
+ ret_file_info = _ostree_header_gfile_info_new (mode, uid, gid);
if (S_ISREG (mode))
{
&uid, &gid, &mode, &rdev,
&symlink_target, &ret_xattrs);
- size = GUINT64_FROM_BE (size);
uid = GUINT32_FROM_BE (uid);
gid = GUINT32_FROM_BE (gid);
mode = GUINT32_FROM_BE (mode);
rdev = GUINT32_FROM_BE (rdev);
+ ret_file_info = _ostree_header_gfile_info_new (mode, uid, gid);
- ret_file_info = g_file_info_new ();
- g_file_info_set_size (ret_file_info, size);
- g_file_info_set_attribute_uint32 (ret_file_info, "standard::type", ot_gfile_type_for_mode (mode));
- g_file_info_set_attribute_boolean (ret_file_info, "standard::is-symlink", S_ISLNK (mode));
- g_file_info_set_attribute_uint32 (ret_file_info, "unix::uid", uid);
- g_file_info_set_attribute_uint32 (ret_file_info, "unix::gid", gid);
- g_file_info_set_attribute_uint32 (ret_file_info, "unix::mode", mode);
+ g_file_info_set_size (ret_file_info, GUINT64_FROM_BE (size));
if (S_ISREG (mode))
{
#include "config.h"
+#include "ostree-core-private.h"
#include "ostree-repo-private.h"
#include "ostree-mutable-tree.h"
struct archive_entry *entry,
OstreeRepoCommitModifier *modifier)
{
- gs_unref_object GFileInfo *info = g_file_info_new ();
+ gs_unref_object GFileInfo *info = NULL;
GFileInfo *modified_info = NULL;
const struct stat *st;
guint32 file_type;
st = archive_entry_stat (entry);
+ info = _ostree_header_gfile_info_new (st->st_mode, st->st_uid, st->st_gid);
file_type = ot_gfile_type_for_mode (st->st_mode);
- g_file_info_set_attribute_boolean (info, "standard::is-symlink", S_ISLNK (st->st_mode));
- g_file_info_set_attribute_uint32 (info, "standard::type", file_type);
- g_file_info_set_attribute_uint32 (info, "unix::uid", st->st_uid);
- g_file_info_set_attribute_uint32 (info, "unix::gid", st->st_gid);
- g_file_info_set_attribute_uint32 (info, "unix::mode", st->st_mode);
if (file_type == G_FILE_TYPE_REGULAR)
{
goto out;
}
- ret_info = g_file_info_new ();
+ ret_info = _ostree_header_gfile_info_new (stbuf.st_mode, stbuf.st_uid, stbuf.st_gid);
if (S_ISREG (stbuf.st_mode))
{
- g_file_info_set_file_type (ret_info, G_FILE_TYPE_REGULAR);
g_file_info_set_size (ret_info, stbuf.st_size);
}
else if (S_ISLNK (stbuf.st_mode))
char targetbuf[PATH_MAX+1];
ssize_t len;
- g_file_info_set_file_type (ret_info, G_FILE_TYPE_SYMBOLIC_LINK);
-
do
len = readlinkat (self->objects_dir_fd, loose_path_buf, targetbuf, sizeof (targetbuf) - 1);
while (G_UNLIKELY (len == -1 && errno == EINTR));
goto out;
}
- g_file_info_set_attribute_boolean (ret_info, "standard::is-symlink", S_ISLNK (stbuf.st_mode));
- g_file_info_set_attribute_uint32 (ret_info, "unix::uid", stbuf.st_uid);
- g_file_info_set_attribute_uint32 (ret_info, "unix::gid", stbuf.st_gid);
- g_file_info_set_attribute_uint32 (ret_info, "unix::mode", stbuf.st_mode);
-
ret = TRUE;
gs_transfer_out_value (out_info, &ret_info);
out: